//
//  HMStatusViewModel.swift
//  Weibo22
//
//  Created by Apple on 16/12/4.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit
import YYText

//  微博数据处理对应的ViewModel
class HMStatusViewModel: NSObject {

    //  需要引用微博数据模型
    var status: HMStatus? {
        didSet {
            //  为了安全起见
            guard let currentStatus = status else {
                return
            }
            
            //  处理会员等级图片
            handlembrankImage(mbrank: currentStatus.user?.mbrank ?? 0)
            //  处理认证类型等级图片
            handleVerifiedTypeImage(verfiedType: currentStatus.user?.verified_type ?? 0)
            //   转发,评论,赞的数据显示逻辑
            retweetCountContent = handleCountContent(count: currentStatus.reposts_count, defaultTitle: "转发")
            commentCountContent = handleCountContent(count: currentStatus.comments_count, defaultTitle: "评论")
            unlikeCountContent = handleCountContent(count: currentStatus.attitudes_count, defaultTitle: "赞")
            //  处理转发微博内容
            handleRetweetContent(status: currentStatus)
            //  处理来源微博数据
            handleSourceContent(source: currentStatus.source ?? "")
            
            //  处理原创微博富文本
            originalAttributedString = handleAttributeString(text: currentStatus.text ?? "")
            
            
            
            
        }
    }
    
    //  原创微博富文本
    var originalAttributedString: NSAttributedString?
    //  转发微博对应的富文本
    var retweetAttributedString: NSAttributedString?
    
    //  转发微博内容
    var retweetContent: String?
    
    //  会员等级图片
    var mbrankImage: UIImage?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    
    //  转发数内容
    var retweetCountContent: String?
    //  评论数内容
    var commentCountContent: String?
    //  赞数内容
    var unlikeCountContent: String?
    //  微博来源
    var sourceContent: String?
    
    
    //  处理微博富文本
    private func handleAttributeString(text: String) -> NSAttributedString {
        //  把字符串转成富文本
        let resultAttributeString = NSMutableAttributedString(string: text)
        
        //  使用正则匹配表情描述
        let matchResult = try! NSRegularExpression(pattern: "\\[\\w+\\]", options: []).matches(in: text, options: [], range: NSMakeRange(0, (text as NSString).length))
        
        for match in matchResult.reversed() {
            
            //  表情描述对应的范围
            let range = match.range
            
            print(NSStringFromRange(range))
            //  获取表情描述
            let chs = (text as NSString).substring(with: range)
            
            
            //  通过表情描述查找符合表情描述的表情模型, 可以获取表情模型里面的表情图片路径
            if let emoticon = HMEmoticonTools.sharedTools.selectEmoticon(chs: chs) {
            
                //  获取模型里面对应的path路径创建UImage对象,  -> 根据图片创建富文本
                
                //let image = UIImage(named: emoticon.path!)
                
          
                //  .....
                //  通过表情模型创建表情富文本
//                let emoticonAttribuedStr = NSAttributedString.attributeStringWithEmoticon(emoticon: emoticon, font: UIFont.systemFont(ofSize: 14))
                
                let image = UIImage(named: emoticon.path!)
                //  使用YYText方式创建表情富文本
                let emoticonAttribuedStr = NSAttributedString.yy_attachmentString(withEmojiImage: image!, fontSize: 14)!
                
                //  根据表情描述的返回替换成表情富文本
                resultAttributeString.replaceCharacters(in: range, with: emoticonAttribuedStr)
                
            }
            
            
            
        }
        
        //  设置富文本的字体大小
        resultAttributeString.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 14), range: NSMakeRange(0, resultAttributeString.length))
        
//        //  获取富文本对应的字符串,匹配高亮文字范围
//        let content = resultAttributeString.string
//        //  使用正则匹配高亮文字
//        let highlightedMatchResult = try! NSRegularExpression(pattern: "@[^:：]+", options: []).matches(in: content, options: [], range: NSMakeRange(0, (content as NSString).length))
//        //  遍历高亮范围结果
//        for highlightedMatch in highlightedMatchResult {
//            //  高亮范围
//            let highlightedRange = highlightedMatch.range
//            //  高亮的前景色
//            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
//            //  给高亮范围设置高亮的前景色
//            resultAttributeString.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
//            
//            //  创建文本高亮对象
//            let textHighlighted = YYTextHighlight()
//            //  点击高亮的背景色
//            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
//            //  点击高亮文字边框内容对象
//            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
//            //  设置内容边框距离YYLabel边框间距
//            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
//            //  设置点击高亮的背景边框内容对象
//            textHighlighted.setBackgroundBorder(textBorder)
//            //  设置点击高亮的背景色
//            resultAttributeString.yy_setTextHighlight(textHighlighted, range: highlightedRange)
//        
//        }
        
        //@xxx:
        addHighlightedAttributedString(resultAttributeString: resultAttributeString, pattern: "@[^:：]+")
        //#xx#
        addHighlightedAttributedString(resultAttributeString: resultAttributeString, pattern: "#[^#]+#")
        //http://xxxx
        addHighlightedAttributedString(resultAttributeString: resultAttributeString, pattern: "http[s]?://[^\\s\\u4e00-\\u9fa5]+")
        
        
        
        return resultAttributeString
    }
    
    //  添加点击高亮文字颜色的方法
    private func addHighlightedAttributedString(resultAttributeString: NSMutableAttributedString, pattern: String) {
        //  获取富文本对应的字符串,匹配高亮文字范围
        let content = resultAttributeString.string
        //  使用正则匹配高亮文字
        let highlightedMatchResult = try! NSRegularExpression(pattern: pattern, options: []).matches(in: content, options: [], range: NSMakeRange(0, (content as NSString).length))
        //  遍历高亮范围结果
        for highlightedMatch in highlightedMatchResult {
            //  高亮范围
            let highlightedRange = highlightedMatch.range
            //  高亮的前景色
            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
            //  给高亮范围设置高亮的前景色
            resultAttributeString.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
            
            //  创建文本高亮对象
            let textHighlighted = YYTextHighlight()
            //  点击高亮的背景色
            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
            //  点击高亮文字边框内容对象
            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
            //  设置内容边框距离YYLabel边框间距
            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
            //  设置点击高亮的背景边框内容对象
            textHighlighted.setBackgroundBorder(textBorder)
            //  设置点击高亮的背景色
            resultAttributeString.yy_setTextHighlight(textHighlighted, range: highlightedRange)
            
        }
        
    
    }
    
    
    var timeContent: String? {
        //  获取发微博的时间
        guard let createAt = status?.created_at else {
        
            return nil
        }
        
        
        return createAt.sinaTimeString
        
        //  代码执行到此,表示发微博时间不为nil
//        let dt = DateFormatter()
//        if isThisYear(createAt: createAt) {
//            print("是今年")
//            //  创建日历对象
//            let calendar = Calendar.current
//            if calendar.isDateInToday(createAt) {
//                //  是今天
//                //  计算发微博时间距离现在时间差多少秒
//                //createAt.timeIntervalSince(xx)
//                let timeInterval = abs(createAt.timeIntervalSinceNow)
//                if timeInterval < 60 {
//                    //  1分钟之前
//                    return "刚刚"
//                } else if timeInterval < 3600 {
//                    //  1小时之前
//                    let result = Int(timeInterval) / 60
//                    return "\(result)分钟前"
//                } else {
//                    //  其它
//                    let result = Int(timeInterval) / 3600
//                    return "\(result)小时前"
//                }
//                
//                
//                
//                
//                
//            } else if calendar.isDateInYesterday(createAt) {
//                //  是昨天
//                dt.dateFormat = "昨天 HH:mm"
//            } else {
//                //  其它
//                dt.dateFormat = "MM-dd HH:mm"
//            }
//            
//            
//            
//        } else {
//            print("不是今年")
//            dt.dateFormat = "yyyy-MM-dd HH:mm"
//        }
//        return dt.string(from: createAt)
        
    }
    
//    private func isThisYear(createAt: Date) -> Bool {
//        
//        let dt = DateFormatter()
//        dt.dateFormat = "yyyy"
//        //  获取发微博时间的年份
//        let createAtYear = dt.string(from: createAt)
//        //  当前时间的年份
//        let currentYear = dt.string(from: Date())
//        
//        return createAtYear == currentYear
//        
//    }
    
    
    
    //  处理微博来源数据
    private func handleSourceContent(source: String) {
        //<a href=\"http://app.weibo.com/t/feed/3auC5p\" rel=\"nofollow\">皮皮时光机</a>
        
        if source.contains("\">") && source.contains("</") {
        
            //  表示这个子串存在我们的特定的字符串里面
            
            if let startRange = source.range(of: "\">"), let endRange = source.range(of: "</") {
                //  表示这个范围的最后光标位置(upperBound)
                let startIndex = startRange.upperBound
                //  表示这个范围的开始光标位置(lowerBound)
                let endIndex = endRange.lowerBound
                
                let result = source.substring(with: startIndex..<endIndex)
                //  获取截取字符串的结果
                sourceContent = "来自: " + result
                
            }
            
            
            
            
            
        }
        
        
    
    }
    
    //  处理微博显示内容
    private func handleRetweetContent(status: HMStatus) {
        //  判断其是否有转发微博
        if status.retweeted_status != nil {
            //  获取转发微博用户的昵称
            //  获取转发微博内容
            if let name = status.retweeted_status?.user?.screen_name, let text = status.retweeted_status?.text {
            
                //  代码执行到此,表示昵称和转发微博内容一定有值
                retweetContent = "@\(name): \(text)"
                
                //  设置转发微博对应的富文本
                retweetAttributedString = handleAttributeString(text: retweetContent!)
            
            }
            
        }
        
    
    }
    
    
    /*  转发,评论,赞的数据显示逻辑
        1. 判断数量是否大于0 如果大于0 判断其是否大于等10000, 如果大于等于10000,显示1.x万
        2. 如果大于0 小于10000,那么显示指定数据
        3. 如果等于0 那么显示原始文字
     */
    
    private func handleCountContent(count: Int, defaultTitle: String) -> String {
        
        if count > 0 {
            if count >= 10000 {
                //  显示1.x万
                let result = CGFloat(count / 1000) / 10
                
                let str = "\(result)万"
                //  判断是否包含.0
                if str.contains(".0") {
                    //  替换特定字符串
                    return str.replacingOccurrences(of: ".0", with: "")
                } else {
                    return str
                }
                
                
                
            } else {
                return "\(count)"
            }
        } else {
            //  显示原始文字
            return defaultTitle
        }
        
    
    }
    
    
    
    
    //  处理认证类型等级图片
    private func handleVerifiedTypeImage(verfiedType: Int) {
        /// 认证类型 -1：没有认证，1，认证用户，2,3,5: 企业认证，220: 达人
        switch verfiedType {
        case 1:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
        
    }
    
    
    //  处理会员等级图片
    private func handlembrankImage(mbrank: Int) {
        //  会员等级 1-6
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        }
        
        
    }
    
}
